﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Reflection;

namespace EstoqueUnifeiADO.Controles
{
    public partial class ctrlEntradaNota : System.Web.UI.UserControl
    {

        public event EntradaNotasHandler ProcessarEntradaNota;
        public event EventHandler ConcluirProcesso;
        public event EventHandler CancelarProcesso;

        protected string ControlGrupoDeValidacao
        {
            get { return "Group" + this.ClientID; }

        }

        private void SetContainerValidationGroup(Control container,string grupoDeValidacao)
        {


            foreach (Control item in container.Controls)
            {
                if (item is BaseValidator)
                {
                    ((BaseValidator)item).Text = "*";
                    ((BaseValidator)item).ForeColor = Color.Red;
                    ((BaseValidator)item).Display = ValidatorDisplay.Dynamic;
                    ((BaseValidator)item).ToolTip = ((BaseValidator)item).ErrorMessage;
                }
                PropertyInfo campo = item.GetType().GetProperty("ValidationGroup");
                if (campo != null)
                    if (campo.CanWrite)
                        campo.SetValue(item,grupoDeValidacao, null);
                if (item.Controls.Count > 0)
                    SetContainerValidationGroup(item, grupoDeValidacao);

            }

        }

        protected void AddError(String Erro,string grupoDeValidacao)
        {
            this.Page.Validators.Add(new CustomValidator()
            {
                IsValid = false,
                ErrorMessage = Erro,
                Display = ValidatorDisplay.Dynamic,
                ValidationGroup = this.ControlGrupoDeValidacao

            });
        }

        private string DataSession { get { return this.ID + "ViewState"; } }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                ViewState.Add(DataSession, new List<ProdQuant>());

            vsMain.ValidationGroup = ControlGrupoDeValidacao;
            btnProcessar.ValidationGroup = ControlGrupoDeValidacao;

            SetContainerValidationGroup(pnlDadosNota, ControlGrupoDeValidacao);
            SetContainerValidationGroup(pnlAddItem, ControlGrupoDeValidacao + "Add");
            
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                List<ProdQuant> items = ViewState[DataSession] as List<ProdQuant>;
                items.Add(new ProdQuant()
                {
                    CodIndex = items.Count + 1,
                    CodProduto = Convert.ToInt32(ddlProduto.SelectedValue),
                    NomeProduto = ddlProduto.SelectedItem.Text,
                    Quantidade = Convert.ToDecimal(tbQuantidade.Text),
                    Valor = Convert.ToDecimal(tbValor.Text)

                });
                gvListaProdutos.DataSource = items;
                gvListaProdutos.DataBind();
                ClearEntradaProdutos();
            }
            catch (Exception ex)
            {
                this.Page.Validators.Add( new CustomValidator()
                {
                    ErrorMessage="Ocorreu o seguinte erro ao tentar inserir um item: "+ex.Message,
                    IsValid=false,
                    ValidationGroup="vsAdd",
                    Display=ValidatorDisplay.Dynamic
                });                
            }
            
            
                                        
        }

        protected void ClearAll() 
        {
            (ViewState[DataSession] as List<ProdQuant>).Clear();
            tbDataEntrada.Text = string.Empty;
            tbNumeroEmpenho.Text = string.Empty;
            tbNumeroNota.Text = string.Empty;
            tbNumeroProcesso.Text = string.Empty;
            ddlFornecedor.SelectedIndex = ddlFornecedor.Items.IndexOf(ddlFornecedor.Items.FindByValue(string.Empty));
            ClearEntradaProdutos();
            
        }

        protected void ClearEntradaProdutos() 
        {
            tbQuantidade.Text = string.Empty;
            tbValor.Text = string.Empty;
            ddlProduto.SelectedIndex = ddlProduto.Items.IndexOf(ddlProduto.Items.FindByValue(string.Empty));
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            ClearAll();
            if (CancelarProcesso != null)
                CancelarProcesso(this, EventArgs.Empty);
        }

        protected void gvListaProdutos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Del") 
            {
                (ViewState[DataSession] as List<ProdQuant>).
                    RemoveAll(x => x.CodIndex.Equals(Convert.ToInt32(e.CommandArgument)));
                gvListaProdutos.DataSource = ViewState[DataSession];
                gvListaProdutos.DataBind();
            }
        }

        protected void btnProcessar_Click(object sender, EventArgs e)
        {
            if (ProcessarEntradaNota == null)
                return;

            List<ProdQuant> items=ViewState[DataSession] as List<ProdQuant>;

            try
            {
                if (items.Count < 1)
                    throw new Exception("Você deve adicionar item para processar a nota.");
                EntradaNotaArgs entradaNota = new EntradaNotaArgs();
                entradaNota.Produtos=items;
                entradaNota.Observacao = "Processamento entrada de notas";
                entradaNota.Nota.CodFornecedor = Convert.ToInt32(ddlFornecedor.SelectedValue);
                entradaNota.Nota.DataEntrada = Convert.ToDateTime(tbDataEntrada.Text);
                entradaNota.Nota.NumeroEmpenho = tbNumeroEmpenho.Text;
                entradaNota.Nota.NumeroProcesso = tbNumeroProcesso.Text;
                entradaNota.Nota.NumeroNota = tbNumeroNota.Text;

                ProcessarEntradaNota(this, entradaNota);

                if (entradaNota.Cancelar)
                    throw new Exception("Ocorreu o seguinte erro ao tentar processar a nota: " + entradaNota.MensagemDeErro);
                else
                    if (ConcluirProcesso != null)
                        ConcluirProcesso(sender, EventArgs.Empty);

            }
            catch (Exception ex)
            {

                AddError(ex.Message, ControlGrupoDeValidacao);
            }
         
            
        }
    }
}